問題解説 Docker 実技

解説

問題

DockerサーバとDockerレジストリサーバがあります。
Dockerサーバでdocker-composeでRedmineのサービスを立ち上げようとしたが、うまく起動しない・・・。
もう少しで立ち上がりそうだが、原因がわからないので修正し、VNCマシンからRedmineのページにアクセスできるようにしてください!

構成

ルータ[VyOS]

  • eth0(192.168.0.1) — VNC操作マシン(192.168.0.254)
  • eth1(172.16.0.1) — Dockerサーバ(172.16.0.2)
  • eth2(172.17.0.1) — Dockerレジストリ(172.17.0.2)

トポロジ図

ログイン情報(ssh)

  • VyOS: 操作不可
  • Dockerサーバ:
    • ID: root
    • Pass: xxxxxx
    • sshポート: 22
  • Dockerレジストリ: 操作不可

条件:

  • DockerRegistry上のDockerImageをコンテナとして使用すること
  • Dockerサーバにあるdocker-compose.yml(変更不可)を用いてRedmineサービスを立ち上げること
  • 必要に応じてDockerの設定を変更してかまわない
  • VNCマシンのブラウザからredmineページが表示されること

回答方法:

  • 「問題文」にて提示した条件が達成されているかで採点します。
  • サーバの状況のみで採点を行います。
  • 対応完了の報告は必要ありません。

解説

DockerでRedmineサービスを立ち上げる過程でのトラブルシューティングの問題です。
以下の問題を解決するとサービスが立ち上がります。

  • ① DockerレジストリLANとDockerサーバのnic-docker0のIP帯重複の解消
  • ② docker pullによるDockerイメージのダウンロードをhttp(80)にする(insecureオプション設定)

Dockerサーバにてdocker-compose up等でredmineサービスを立ち上げようとするとエラーとなります。
docker-compose.ymlに記載されているDockerイメージを見ると

...
redmine:
    image: docker-registry.local/redmine
...

イメージの取得元がdocker-registry.localになっています。
名前解決すると172.17.0.2で、これは/etc/hostsに記載されています。

つまり172.17.0.2のDockerレジストリからイメージを取得して使う意図が読み取れます。
しかしながらDockerサーバから172.17.0.2にpingを実行すると応答がありません。

[root@docker-server ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
From 172.17.0.1 icmp_seq=1 Destination Host Unreachable

これはDockerが作成している仮想NIC(docker0)が172.17.0.1/16であることが原因です。
Dockerレジストリ(172.17.0.2)向けのパケットがdocker0へルーティングされるため、正しくDockerレジストリと通信できません。

このため、docker0のIP帯を使用されていないプライベートIP帯に変更します。
変更する方法は複数ありますが、例として/etc/sysconfig/dockerOPTIONに記述する方法を示します。

[root@docker-server ~]# cat /etc/sysconfig/docker
...
OPTIONS='--insecure-registry 172.17.0.2 --bip 192.168.100.1/24  --selinux-enabled --log-driver=journald --signature-verification=false'
...

OPTIONS--bip 192.168.100.1/24を追加してdockerサービスを再起動します。

nicのdocker0のIPが変更されたことを確認します。

[root@docker-server ~]# ip a
...
3: docker0:  mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:28:18:cc:19 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.1/24 scope global docker0
       valid_lft forever preferred_lft forever
...

これでDockerレジストリ(172.17.0.2)へ疎通が取れるようになりました。

[root@docker-server ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=63 time=1.19 ms

①のIP帯重複問題を解決後にdocker-compose upを実行してもまだイメージをpullすることができません。

[root@docker-server ~]# docker-compose up
Pulling db (docker-registry.local/mariadb:)...
Trying to pull repository docker-registry.local/mariadb ...
ERROR: Get https://docker-registry.local/v1/_ping: dial tcp 172.17.0.2:443: getsockopt: no route to host

エラーを見ると172.17.0.2:443に接続し、アクセスに失敗していることがわかります。
curl等で172.17.0.2:443の状態を確認すると動作していません。

ここで、/etc/sysconfig/dockerの設定を見ると

[root@docker-server ~]# cat /etc/sysconfig/docker
...
OPTIONS='--insecure-registry 172.17.0.2 --bip 192.168.100.1/24  --selinux-enabled --log-driver=journald --signature-verification=false'
...

--insecure-registry 172.17.0.2の記述があり、docker標準のhttps(443)でアクセスさせずに、insecureアクセスであるポート80で通信を行うという意図が確認できます。
一見DockerレジストリサーバIPが172.17.0.2であるため、正しく設定できていそうですが、ここはホスト名を指定する必要があります。
docker-compose.ymlにはDockerレジストリをdocker-registry.localと記載していたため、記述を合わせます。
最終的なetc/sysconfig/dockerは以下の通りです。

[root@docker-server ~]# cat /etc/sysconfig/docker
...
OPTIONS='--insecure-registry docker-registry.local --bip 192.168.100.1/24  --selinux-enabled --log-driver=journald --signature-verification=false'
...

再度Dockerサービスを再起動し、docker-compose upをすることで、Redmineサービスが稼働し、完了となります。

講評

参加者の皆さん競技お疲れさまでした。Docker問題を出題させていただきました。
皆さんの回答結果ですが、満点のチームも多くDocker対策されているなという印象を受けました。

トラブル①

トラブル①のIP帯重複に関しては予選1でも出題された範囲になりますので、解けたチームも多かったのではないでしょうか。
Dockerを使う場合は172系のIP帯がデフォルトで使用されるため、プライベートIP帯との衝突が発生する場合があります。
原因の切り分けとしてサーバへIP層での疎通があるかどうかをしっかりと確認することが大切です。

トラブル②

トラブル②はDockerレジストリに関する問題です。
dockerイメージのpullはデフォルトでhttps通信となっています。
http通信にするためにはオプション指定が必要です。

Docker設定ファイルの/etc/sysconfig/dockerよりinsecureオプションが設定されていることからDockerレジストリへ、http通信を行う意図が読み取れます。
しかし実際には、Dockerイメージpull時のエラーで443ポートで通信を行っていることが読み取れますので、Dockerレジストリへの接続設定を見直すことが必要です。

全体

今回は実務で経験したトラブルを基に作問しました。楽しんで解いていただけたのであれば幸いです。
今後もトラブルシューティングする楽しさを大切にして、多くの技術を学んでください。

本問題で採点ミスが発生し成績発表後に点数、順位が変更となったこと深くお詫び申し上げます。